package org.geekbang.thinking.in.spring.bean.factory;

import org.geekbang.thinking.in.spring.ioc.overview.domain.User;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * Bean的初始化和销毁都有三种方式，分别是执行标注了 java 注解的方法（@PostConstructor和 @PreDestroy）、
 * 实现接口（InitializingBean和 DisposableBean）和自定义方法，如果三者都有，执行顺序为
 * 1、标注了 @PostConstructor和 @PreDestroy 首先执行
 * 2、实现了 InitializingBean和 DisposableBean 接口的方法再次执行
 * 3、自定义初始化和销毁方法最后执行
 */
public class DefaultUserFactory implements UserFactory, InitializingBean, DisposableBean {

    // 1.3、自定义初始化方法
    public void initUserFactory() {
        System.out.println("自定义初始化方法：UserFactory 初始化中...");
    }

    // 2.3、自定义销毁方法
    private void destroyUserFactory() {
        System.out.println("自定义销毁方法：UserFactory 销毁中...");
    }

    // 1.1、基于 @PostConstruct 初始化
    @PostConstruct
    public void init() {
        System.out.println("@PostConstruct UserFactory 初始化中...");
    }

    // 2.1、基于 @PreDestroy 销毁
    @PreDestroy
    public void doDestroy() {
        System.out.println("@PostConstruct UserFactory 销毁中...");
    }

    @Override
    public User createUser() {
        User user = new User();
        user.setId(2L);
        user.setName("戴沐白");
        return user;
    }

    // 1.2、调用 InitializingBean#afterPropertiesSet 方法来初始化
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean#afterPropertiesSet UserFactory 初始化中...");

    }

    // 2.2、调用 DisposableBean#destroy 方法销毁 Bean
    @Override
    public void destroy() throws Exception {
        System.out.println("DisposableBean#destroy UserFactory 销毁中...");
    }

    @Override
    public void finalize() throws Throwable {
        System.out.println("当前 DefaultUserFactory 对象正在被回收...");
    }
}
